package base;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;

/**
 * AJAX帮助类，在action中,使用此工具返回内容。
 */
public class AJAXUtils {
	
	private static JSONObject json = new JSONObject();
	
	private static Log log=LogFactory.getLog(AJAXUtils.class);
	
	public static synchronized JSONObject createJSON(){
		json.clear();
		return json;
	}
	
	public static void renderText(final String content){
		try{
			if(StringUtils.isEmpty(content)){
				log.warn("AjaxRender.java>>method:renderText>>content is null!");
				return;
			}
			HttpServletResponse response = initHeader();
			response.getWriter().write(content);
			response.getWriter().close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	/**
	 * 初始化页面header
	 * @param
	 */
	private static HttpServletResponse initHeader(){
		HttpServletResponse response = ServletActionContext.getResponse();
		response.setHeader("Pragma", "No-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		response.setCharacterEncoding("UTF-8");
		return response;
	}
	
	
	
	/**
	 * 生成分页JSON数据
	 * @param objectList
	 */
	public static void renderPagination(List<JSONObject> objectList,Integer recordCount) {
		if(objectList==null||objectList.size()==0){
			log.warn("JSON集合为空!");
			objectList=new ArrayList<JSONObject>();
		}
		JSONObject jsonRoot = createJSON();
		JSONArray jsonArray = new JSONArray();
		for (JSONObject jsonObj : objectList) {
			jsonArray.add(jsonObj);
		}
		jsonRoot.put("root", jsonArray);
		jsonRoot.put("totalProperty", recordCount);
		renderText(jsonRoot.toString());
	}
	/**
	 * 生成分页JSON数据
	 * @param
	 */
	public static void renderJSONArray(JSONArray array,Integer recordCount) {
		if(array == null || array.size() == 0){
			log.warn("JSON集合为空!");
			array=new JSONArray();
		}
		JSONObject jsonRoot = createJSON();
		jsonRoot.put("root", array);
		jsonRoot.put("totalProperty", recordCount);
		renderText(jsonRoot.toString());
	}
	
	/**
	 * 生成JSON数组
	 * @param objectList
	 */
	public static void renderList(List<JSONObject> objectList,String root) {
		if(objectList==null||objectList.size()==0){
			log.warn("JSON集合为空!");
			objectList=new ArrayList<JSONObject>();
		}
		JSONObject jsonRoot = createJSON();
		JSONArray jsonArray = new JSONArray();
		for (JSONObject jsonObj : objectList) {
			jsonArray.add(jsonObj);
		}
		jsonRoot.put(root, jsonArray);
		renderText(jsonRoot.toString());
	}
	
	/**
	 * 生成JSON数组
	 * @param
	 */
	public static void renderList(JSONArray array,String root) {
		if(array == null||array.size()==0){
			log.warn("JSON集合为空!");
			array = new JSONArray();
		}
		JSONObject jsonRoot = createJSON();
		jsonRoot.put(root, array);
		renderText(jsonRoot.toString());
	}

	/**
	 * 向页面返回一个错误JSON信息。
	 * @param msg
	 */
	public static void renderFailure(String msg) {
		JSONObject json = createJSON();
		json.element("failure", true);
		json.element("msg", msg);
		AJAXUtils.renderText(json.toString());
	}

	/**
	 * 向页面返回一个成功JSON信息。
	 * @param msg
	 */
	public static void renderSuccess(String msg) {
		JSONObject json = createJSON();
		json.element("success", true);
		json.element("msg", msg);
		AJAXUtils.renderText(json.toString());
	}
	
	/**
	 * 向页面返回一个成功JSON信息并将生成的ID传递到页面
	 * @param msg
	 */
	public static void renderSuccess(String msg,Integer id) {
		JSONObject json = createJSON();
		json.element("success", true);
		json.element("msg", msg);
		json.element("id", id);
		AJAXUtils.renderText(json.toString());
	}
	
	/**
	 * 判断是不是AJAX请求
	 * */
	public static boolean isAJAX(HttpServletRequest request){
		if(request.getHeader("x-requested-with") != null 
				&& request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
			return true;
		}
		return false;
	}
	
}
